package trastienda.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import trastienda.excepcion.DAOExcepcion;
import trastienda.modelo.Producto;
import trastienda.modelo.Usuario;

@Repository
public class ProductoDAOImpl implements ProductoDAO {

	@Autowired
	private JdbcTemplate jdbcTemplate;

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	
	@SuppressWarnings(value = "unchecked")
	public Collection<Producto> listarTodos() throws DAOExcepcion {
	        System.out.println("ProductoDAOImpl: listarTodos()");
	        String sql = "select id_producto,nombre,descripcion,precio,stock, importancia, imagen from producto";

	        RowMapper mapper = new RowMapper() {
	                public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
	                        Producto vo = new Producto();
	                        vo.setIdProducto(rs.getInt("id_producto"));				
	        				vo.setNombre(rs.getString("nombre"));
	        				vo.setDescripcion(rs.getString("descripcion"));
	        				vo.setPrecio(rs.getFloat("precio"));
	        				vo.setStock(rs.getInt("stock"));
	        				vo.setImportancia(rs.getInt("importancia"));
	        				vo.setImagen(rs.getString("imagen"));	                        
	                        return vo;
	                }
	        };
	        return jdbcTemplate.query(sql, mapper);
	}
	
	
	@SuppressWarnings(value = "unchecked")
    public Collection<Producto> buscarPorNombre(String nombre)
                    throws DAOExcepcion {
            System.out.println("ProductoDAOImpl: buscarPorNombre() : " + nombre);

            String sql = "select id_producto,nombre,descripcion,precio,stock, importancia, imagen from producto"
                            + " where nombre like ? ";

            RowMapper mapper = new RowMapper() {

                    public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                    	Producto vo = new Producto();
                        vo.setIdProducto(rs.getInt("id_producto"));				
        				vo.setNombre(rs.getString("nombre"));
        				vo.setDescripcion(rs.getString("descripcion"));
        				vo.setPrecio(rs.getFloat("precio"));
        				vo.setStock(rs.getInt("stock"));
        				vo.setImportancia(rs.getInt("importancia"));
        				vo.setImagen(rs.getString("imagen"));	                        
                        return vo;
                    }
            };
            return jdbcTemplate.query(sql, new Object[] { "%" + nombre + "%" },
                            mapper);
    }
	
	
	@SuppressWarnings(value = "unchecked")
	public Producto insertar(Producto pro) throws DAOExcepcion{
		System.out.println("insertar");
		String query = "INSERT INTO producto (id_categoria,nombre,descripcion,precio,stock,importancia,imagen)"
				+ "VALUES (?,?,?,?,?,?,?)";
		Object[] params = new Object[] {pro.getCategoria().getIdCategoria(), pro.getNombre(),pro.getDescripcion(), pro.getPrecio(), pro.getStock(),pro.getImportancia(), pro.getImagen()};
		try {
			jdbcTemplate.update(query, params);
		} catch (Exception e) {
			throw new DAOExcepcion(e.getMessage());
		}
		return pro;
	}

	@SuppressWarnings("unchecked")
	public Producto obtenerPorIdProducto(int idProducto) throws DAOExcepcion {
		System.out.println("ProductoDAOImpl: obtenerPorIdProducto() : "	+ idProducto);

		String sql = "SELECT id_producto,id_categoria, nombre, descripcion, precio, stock, importancia, imagen FROM producto where id_producto=?";

		RowMapper mapper = new RowMapper() {

			public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
				Producto pro = new Producto();
				
				pro.setIdProducto(rs.getInt("id_producto"));
				pro.setNombre(rs.getString("nombre"));
				pro.setDescripcion(rs.getString("descripcion"));
				pro.setPrecio(rs.getDouble("precio"));
				pro.setStock(rs.getInt("stock"));
				pro.setImportancia(rs.getInt("importancia"));
				pro.setImagen(rs.getString("imagen"));
								
				return pro;
			}
		};
		return (Producto) jdbcTemplate.queryForObject(sql, new Object[] {idProducto, "1" }, mapper);
	}

	public Producto actualizar(Producto pro) throws DAOExcepcion {
		String query = "update producto set nombre=?, descripcion=?, precio=?, stock=?, importancia=?, imagen=? where id_producto=?";
		Object[] params = new Object[] {pro.getNombre(), pro.getDescripcion(), pro.getPrecio(), pro.getStock(),
				pro.getImportancia(), pro.getImagen(), pro.getIdProducto() };
		try {
			jdbcTemplate.update(query, params);
		} catch (Exception e) {
			throw new DAOExcepcion(e.getMessage());
		}
		return pro;
	}
	
	public void eliminar(int idProducto) throws DAOExcepcion {
		String query = "DELETE FROM producto WHERE id_producto=?";
		Object[] params = new Object[] { idProducto };
		try {
			jdbcTemplate.update(query, params);
		} catch (Exception e) {
			throw new DAOExcepcion(e.getMessage());
		}
	}
	
	@SuppressWarnings(value = "unchecked")
    public Collection<Producto> buscarPorCategoria(String categoria)
                    throws DAOExcepcion {
            System.out.println("ProductoDAOImpl: buscarPorCategoria() : " + categoria);

            String sql = "select producto.* from producto,categoria " +
                                "WHERE  categoria.id_categoria=producto.id_categoria AND categoria.nombre=?";
            RowMapper mapper = new RowMapper() {

                    public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                    	Producto vo = new Producto();
                        vo.setIdProducto(rs.getInt("id_producto"));				
        				vo.setNombre(rs.getString("nombre"));
        				vo.setDescripcion(rs.getString("descripcion"));
        				vo.setPrecio(rs.getFloat("precio"));
        				vo.setStock(rs.getInt("stock"));
        				vo.setImportancia(rs.getInt("importancia"));
        				vo.setImagen(rs.getString("imagen"));	                        
                        return vo;
                    }
            };
            return jdbcTemplate.query(sql, new Object[] { categoria},
                            mapper);
    }


}
